import io
import os
import sys
import random

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel, QFileDialog, QCheckBox, \
    QMessageBox, QComboBox, QHBoxLayout, QTableWidgetItem, QTableWidget, QDialog, QAbstractItemView
from PyQt5.QtCore import QTimer, Qt, QTime
from PyQt5.QtGui import QIcon, QPixmap, QImage
import pyttsx3
from wordcloud import WordCloud


class RandomPicker(QWidget):

    ########################################################
    # 设置软件的默认字体
    DEFAULT_APP_FONT_NAME = '楷体'
    # 黑色主题的背景颜色
    DARK_APP_BG_COLOR = '#333333'
    LIGHT_APP_BG_COLOR = '#EAF2F8'  # #EAF2F8 浅蓝色 #FFFFFF 白色
    # 设置姓名显示的样式
    LABEL_NAME_COLOR = '#F4511E'  # 粉红色 #EC407A 橙红 #F4511E
    LABEL_NAME_FONT_SIZE = 56
    LABEL_NAME_FONT_NAME = '楷体'
    # 图标设置
    ICO_ABOUT_URL = 'res/ico/about.png'
    ICO_VERSION_URL = 'res/ico/version.png'
    ICO_DARK_LIGHT_URL = 'res/ico/dark_light.png'
    ICO_CAT_URL = 'res/ico/cat.png'
    ICO_ANALYZE_URL = 'res/ico/analyze.png'
    ICO_IMPORT_URL = 'res/ico/import.png'
    ICO_START_URL = 'res/ico/start.png'
    ICO_PAUSE_URL = 'res/ico/pause.png'
    ICO_WORD_CLOUD_URL = 'res/ico/word_cloud.png'
    # 图片随机时间间隔 ms
    RANDOM_PICTURE_TIME = 1800  # 单位为ms级别 2s钟 更换一次照片
    SPEAK_NAME_TIME = 2  # 语音播放的次数 默认2次
    WC_FONT_URL = 'res/font/wc.ttf'  # 词云字体位置
    ########################################################

    def __init__(self):
        super().__init__()
        self.class_combo = None
        self.label_name = None
        self.timer = None
        self.version = '24618R2'  # 版本信息
        self.DEFAULT_BG_PIC = ['res/bg.png']
        self.DEFAULT_BG_PIC_PATH = 'res/random'  # 默认的随机图片目录
        self.setupVoice()  # 初始化语音引擎
        self.names = []  # 初始化名单为空
        # 初始化的被点中的姓名
        self.current_name = "佛系小吴"
        self.is_random_picture_enabled = False  # 初始化随机图片功能标志为
        self.is_picking = False  # 初始化点名标志为False
        self.isDarkMode = False  # 添加这个标志位，默认为False非暗黑模式
        self.applyTheme()  # 默认应用浅色主题 dark light 可以切换主题配色 False
        self.init_ui()
        self.pictures_list = self.loadPicturesFromDirectory(self.get_resource_path(self.DEFAULT_BG_PIC_PATH))
        self.picture_timer = QTimer(self)  # 新建定时器实例控制图片的随机播放

    def init_ui(self):
        self.setWindowTitle('随机点名器@佛系小吴-24618V3R2')
        # 第一个参数 (300): 窗口左上角距离屏幕左边缘的水平像素距离。
        # 第二个参数 (300): 窗口左上角距离屏幕顶部边缘的垂直像素距离。
        # 第三个参数 (600): 窗口的宽度，即窗口左右边缘之间的像素距离。
        # 第四个参数 (400): 窗口的高度，即窗口上下边缘之间的像素距离。
        self.setGeometry(500, 300, 480, 320)
        # 初始化定时器
        self.timer = QTimer(self)
        # 设置窗口图标
        self.setWindowIcon(QIcon(self.get_resource_path('res/bg.ico')))  # 替换为你的图标文件路径
        # 背景图片
        bg_pixmap = QPixmap(self.get_resource_path(self.DEFAULT_BG_PIC[0]))  # 替换为你的背景图片文件路径
        # 创建布局和控件 这是一个垂直布局的样式
        layout = QVBoxLayout()
        # 创建一个水平布局用于放置按钮 让按钮并排显示
        button_layout = QHBoxLayout()
        # 混合按钮布局
        mix_button_layout = QHBoxLayout()
        # 关于作者和版本信息
        about_info_layout = QHBoxLayout()
        self.label_name = QLabel('请导入数据', self)
        self.label_name.setAlignment(Qt.AlignCenter)
        label_name_style_sheet_base = """ 
            color: {}; /* 深粉红色 #FF1493 red*/
            font-weight: bold; 
            font-size: {}px; 
            font-family: {}; /* 楷体 Consolas */
        """
        label_name_style = label_name_style_sheet_base.format(self.LABEL_NAME_COLOR,
                                                              self.LABEL_NAME_FONT_SIZE, self.LABEL_NAME_FONT_NAME)
        self.label_name.setStyleSheet(label_name_style)
        layout.addWidget(self.label_name)

        # 添加下拉列表选择班级
        self.class_combo = QComboBox(self)
        self.class_combo.setGeometry(0, 0, 10, 20)
        # 填充下拉列表，这里只是示例，动态生成部分应该根据实际需求实现
        self.class_combo.addItems(['选择班级', '佛系小吴', '小组点名', '2401', '2402', '2403', '2404', '2405', '2406'])
        self.class_combo.currentIndexChanged.connect(self.loadClassNames)
        # 设置下拉列表的样式
        combo_style = """
            QComboBox {
                font-size: 18px;
                border: 1px solid #aaaaaa;
                border-radius: 5px;
                padding: 2px;
                min-width: 80px; /* 根据需要设置最小宽度 */
            }
            QComboBox:hover {
                border-color: #4CAF50;
            }
            QComboBox QAbstractItemView {
                border: 1px solid #aaaaaa;
                selection-background-color: #f44336;
            }
            QComboBox::drop-down {
                /* 设置下拉按钮的样式 */
            }
            QComboBox::down-arrow {
                /* 设置下拉箭头的样式 */
            }
            QComboBox:item {
                color: red; /* 设置下拉列表项的字体颜色为红色 */
            }
            QComboBox:item:selected {
                background-color: lightgrey; /* 设置选中项的背景颜色 */
            }
        """
        self.class_combo.setStyleSheet(combo_style)
        mix_button_layout.addWidget(self.class_combo)
        # 把语音播放的按钮也放到一起去
        self.voiceCheckBox = QCheckBox('语音播放', self)
        self.voiceCheckBox.setStyleSheet("""
            QCheckBox {
                font-size: 12px;           /* 设置字体大小 */
                color: #E41188;            /* 设置文字颜色  #E41188 #E46C11 #6C11E4 */
                padding: 5px;              /* 设置内边距 */
                border-radius: 10px;       /* 设置圆角 */
                border: 2px solid #555;    /* 设置边框 */
            }
            QCheckBox:hover {
                border-color: #4CAF50;    /* 鼠标悬浮时边框颜色 */
            }
            QCheckBox:focus {
                border-color: #E46C11;    /* 获取焦点时边框颜色 */
            }
        """)

        self.voiceCheckBox.stateChanged.connect(self.toggleVoice)
        mix_button_layout.addWidget(self.voiceCheckBox)
        # 添加图片随机播放的单选框
        self.randomPicCheckBox = QCheckBox('随机动画', self)
        self.randomPicCheckBox.setStyleSheet("""
            QCheckBox {
                font-size: 12px;           /* 设置字体大小 */
                color: #E46C11;               /* 设置文字颜色 */
                padding: 5px;              /* 设置内边距 */
                border-radius: 10px;       /* 设置圆角 */
                border: 2px solid #555;    /* 设置边框 */
            }
            QCheckBox:hover {
                border-color: #E41188;    /* 鼠标悬浮时边框颜色 */
            }
            QCheckBox:focus {
                border-color: #2196F3;    /* 获取焦点时边框颜色 */
            }
        """)
        self.randomPicCheckBox.stateChanged.connect(self.enableDisableRandomPicture)
        mix_button_layout.addWidget(self.randomPicCheckBox)
        # 添加控制背景显示与隐藏的单选按钮
        self.showBackgroundCheckBox = QCheckBox('显示图片', self)
        self.showBackgroundCheckBox.setStyleSheet("""
            QCheckBox {
                font-size: 12px;           /* 设置字体大小 */
                color: #6C11E4;               /* 设置文字颜色 */
                padding: 5px;              /* 设置内边距 */
                border-radius: 10px;       /* 设置圆角 */
                border: 2px solid #555;    /* 设置边框 */
            }
            QCheckBox:hover {
                border-color: #6C11E4;    /* 鼠标悬浮时边框颜色 */
            }
            QCheckBox:focus {
                border-color: #2196F3;    /* 获取焦点时边框颜色 */
            }
        """)
        self.showBackgroundCheckBox.setChecked(True)  # 默认显示
        self.showBackgroundCheckBox.stateChanged.connect(self.toggleBackgroundVisibility)
        mix_button_layout.addWidget(self.showBackgroundCheckBox)
        # 在mix_button_layout布局中添加主题切换按钮
        self.themeButton = QPushButton('亮/暗', self)
        self.themeButton.setStyleSheet("""
            background-color: #2196F3; 
            color: white; 
            border-radius: 10px;
            padding: 5px;
            margin: 2px;
            &:hover { background-color: #03A9F4; }
            &:pressed { background-color: #0288D1; }
        """)
        self.themeButton.clicked.connect(self.toggleTheme)
        self.themeButton.setToolTip('点击切换主题亮暗')
        self.themeButton.setIcon(QIcon(self.get_resource_path(self.ICO_DARK_LIGHT_URL)))
        mix_button_layout.addWidget(self.themeButton)

        # 最下面的图片显示设置
        self.label_background = QLabel(self)

        self.label_background.setFixedSize(480, 320)
        self.label_background.setPixmap(bg_pixmap.scaled(self.size(), Qt.IgnoreAspectRatio))

        # 在initUI方法中添加显示时间
        self.label_time = QLabel('00:00:00', self)  # 初始化时间为当前时间的字符串
        self.label_time.setAlignment(Qt.AlignCenter)
        self.label_time.setStyleSheet("""
                font-size: 36px;
                color: #F0FFF0;  /* 设置字体颜色 #34a853 绿色  #F0FFF0 灰暗*/
                background-color: #EE6AA7;  /* 设置背景颜色   灰色/灰色 ＃808080 甘露 #F0FFF0  HotPink2 #EE6AA7 */
                border-radius: 10px;  /* 设置边框圆角 */
                padding: 10px;  /* 设置内边距 */
                font-family: 'Consolas';
            """)
        layout.addWidget(self.label_time)  # 将时间标签添加到布局中

        # 创建关于作者和版本信息的按钮
        self.about_button = QPushButton('关于作者', self)
        self.about_button.setIcon(QIcon(self.get_resource_path(self.ICO_ABOUT_URL)))
        self.about_button.clicked.connect(self.showAboutAuthor)
        self.version_button = QPushButton('版本信息', self)
        self.version_button.setIcon(QIcon(self.get_resource_path(self.ICO_VERSION_URL)))
        self.version_button.clicked.connect(self.showVersionInfo)
        self.word_cloud_button = QPushButton('生成词云', self)
        self.word_cloud_button.setIcon(QIcon(self.get_resource_path(self.ICO_WORD_CLOUD_URL)))
        self.word_cloud_button.clicked.connect(self.generate_word_cloud)
        about_info_layout.addWidget(self.about_button)
        about_info_layout.addWidget(self.version_button)
        about_info_layout.addWidget(self.word_cloud_button)  # 将按钮添加到布局中
        layout.addLayout(about_info_layout)
        # 将水平的控制按钮布局添加到垂直布局中
        layout.addLayout(mix_button_layout)
        # 在initUI方法中添加定时器设置
        self.time_timer = QTimer(self)
        self.time_timer.timeout.connect(self.updateTime)  # 连接定时器信号和槽函数
        self.time_timer.start(1000)  # 设置定时器时间间隔为1000毫秒（1秒）

        self.startButton = QPushButton('开始点名', self)
        self.startButton.setIcon(QIcon(self.get_resource_path(self.ICO_START_URL)))
        self.startButton.setStyleSheet("background-color: #2196F3; color: white; border-radius: 10px;")
        self.startButton.clicked.connect(self.startPicking)
        self.stopButton = QPushButton('暂停点名', self)
        self.stopButton.setIcon(QIcon(self.get_resource_path(self.ICO_PAUSE_URL)))
        self.stopButton.setStyleSheet("background-color: #f44336; color: white; border-radius: 10px;")
        self.stopButton.clicked.connect(self.stopPicking)
        self.importButton = QPushButton('导入名单', self)
        self.importButton.setIcon(QIcon(self.get_resource_path(self.ICO_IMPORT_URL)))
        self.importButton.clicked.connect(self.importNames)
        # 添加查看名单按钮
        self.viewNamesButton = QPushButton('查看名单', self)
        self.viewNamesButton.setIcon(QIcon(self.get_resource_path(self.ICO_CAT_URL)))
        self.viewNamesButton.clicked.connect(self.viewCurrentNames)
        # 添加姓氏分析按钮
        self.analyzeButton = QPushButton('姓氏统计', self)
        self.analyzeButton.setIcon(QIcon(self.get_resource_path(self.ICO_ANALYZE_URL)))
        self.analyzeButton.clicked.connect(self.show_surname_analysis)


        # 添加按钮到水平布局
        button_layout.addWidget(self.startButton)
        button_layout.addWidget(self.stopButton)
        button_layout.addWidget(self.importButton)
        button_layout.addWidget(self.viewNamesButton)
        button_layout.addWidget(self.analyzeButton)  # 将按钮添加到布局中
        # 将水平按钮的控制布局添加到垂直主布局中
        layout.addLayout(button_layout)
        # 添加背景标签 优化这个图片显示的设计 layout为垂直布局
        layout.addWidget(self.label_background)
        self.setLayout(layout)
        self.show()

    def analyze_surnames(self):
        # 分析姓氏出现的次数
        surname_counts = {}
        for name in self.names:
            # 去除字符串首尾的空白字符，并尝试获取第一个字符
            surname = name.strip()[0] if name.strip() else ''
            if surname in surname_counts:
                surname_counts[surname] += 1
            else:
                surname_counts[surname] = 1
        return surname_counts

    def show_surname_analysis(self):
        # 检查是否有数据
        if not self.names:
            QMessageBox.warning(self, '提示', '无数据无法分析')
            return  # 如果没有数据，直接返回
        surname_counts = self.analyze_surnames()
        # 创建 QDialog 实例
        dialog = QDialog(self)
        dialog.setWindowTitle('姓氏统计')
        dialog.setGeometry(1000, 300, 236, 480)  # x, y, width, height
        # 创建表格
        table_widget = QTableWidget(dialog)
        table_widget.setRowCount(len(surname_counts) + 1)  # 表头也算一行
        table_widget.setColumnCount(2)  # 两列：姓氏和出现次数
        # 设置列宽
        table_widget.setColumnWidth(0, 80)  # 固定第一列宽度为100
        table_widget.setColumnWidth(1, 80)  # 固定第二列宽度为100
        # 添加表头
        table_widget.setHorizontalHeaderLabels(['姓氏', '人次'])
        table_widget.setEditTriggers(QAbstractItemView.NoEditTriggers)  # 设置表格不可编辑
        # 使用QSS样式表设置表格样式
        table_widget.setStyleSheet("""
                    QTableWidget {
                        background-color: #FADBD8; /* 表格背景色 */
                        color: #B3E5FC; /*#B3E5FC 字体颜色 black*/
                        font-size: 20px; /* 字体大小 */
                        selection-background-color: lightgray; /* 选中行的背景色 */
                    }
                    QTableWidget::item {
                        text-align: center; /* 文本居中对齐 */
                        vertical-align: middle; /* 垂直居中对齐 */
                        background-color: #B3E5FC; /* 单元格背景色 */
                        color: #E91E63; /* 单元格字体颜色 */
                    }
                    QHeaderView {
                        background-color: #DC7633; /* 表头背景色 */
                        font-weight: bold; /* 表头字体加粗 */
                    }
                """)
        # 填充数据
        row_position = 0
        for surname, count in sorted(surname_counts.items(), key=lambda x: x[1], reverse=True):
            surname_item = QTableWidgetItem(surname)
            count_item = QTableWidgetItem(str(count))
            surname_item.setTextAlignment(Qt.AlignCenter)
            count_item.setTextAlignment(Qt.AlignCenter)
            table_widget.setItem(row_position, 0, surname_item)
            table_widget.setItem(row_position, 1, count_item)
            row_position += 1
        # 布局
        layout = QVBoxLayout()
        layout.addWidget(table_widget)
        dialog.setLayout(layout)
        # 显示弹窗
        dialog.exec_()

    # 生成词云 然后展示
    def generate_word_cloud(self):
        if not self.names:
            QMessageBox.warning(self, '警告', '没数据 无法生成词云')
            return
        # 把所有姓名合并为一个字符串，用空格分隔
        text = ' '.join(self.names)
        # 创建词云对象，并指定支持中文的字体路径
        font_path = self.get_resource_path(self.WC_FONT_URL)  # 指定中文字体路径
        # contour_width = 1,  轮廓宽度 contour_color = 'steelblue',  轮廓颜色  colormap = 'viridis'  颜色映射
        # 如 viridis、plasma、inferno、magma、cividis 等 , colormap='viridis' 取消掉好看些
        word_cloud = WordCloud(font_path=font_path, width=self.label_background.width(), background_color='white',
                               height=self.label_background.height(), colormap='magma').generate(text)
        # 使用Pillow库保存词云图到内存
        image_memory = io.BytesIO()
        image = word_cloud.to_image()
        image.save(image_memory, format='PNG')
        image_memory.seek(0)  # 重置文件指针到文件开头
        # 使用QPixmap从内存加载图片
        image = QImage.fromData(image_memory.read())
        pixmap = QPixmap.fromImage(image)
        self.label_background.setPixmap(pixmap)

    # 处理单文件加载不到的问题 # fixed 24 0616
    def get_resource_path(self, relative_path):
        """ Get absolute path to resource, works for dev and for PyInstaller
             # PyInstaller creates a temp folder and stores path in _MEIPASS
        """
        try:
            base_path = sys._MEIPASS
        except AttributeError:
            base_path = os.path.abspath(".")
        dest_path = os.path.join(base_path, relative_path)
        return dest_path

    # 然后你可以用这个image_path去打开或加载资源
    # 加载指定目录中的所有图片文件地址。
    def loadPicturesFromDirectory(self, directory_path):
        pictures_list = []  # 初始化空列表用于存储图片路径
        # 确保目录路径存在
        if not os.path.exists(directory_path):
            print(f"目录不存在: {directory_path}")
            pictures_list = self.DEFAULT_BG_PIC
            return pictures_list
        # 遍历目录中的所有文件和子目录
        for entry in os.listdir(directory_path):
            full_path = os.path.join(directory_path, entry)
            # 确保是文件且是图片格式
            if os.path.isfile(full_path):
                # 这里可以进一步检查文件扩展名，确保它是图片文件
                if entry.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp')):
                    pictures_list.append(full_path)
        return pictures_list

    def enableDisableRandomPicture(self, state):
        # 根据单选框的状态启用或禁用随机图片功能
        self.is_random_picture_enabled = state == Qt.Checked
        if self.is_random_picture_enabled:
            self.picture_timer.start()  # 启动定时器
        else:
            self.picture_timer.stop()  # 停止定时器

    def toggleBackgroundVisibility(self, state):
        # 根据单选按钮的状态显示或隐藏 label_background
        if state == Qt.Checked:
            self.label_background.show()
        else:
            # 设置背景标签的大小为极小，相当于隐藏
            #self.label_background.setFixedSize(1, 1)
            # 禁止背景标签的大小调整影响窗口布局
            # self.label_background.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            # 更新窗口大小以适应内容，这里直接调用adjustSize方法让Qt自动处理
            #self.adjustSize()
            self.label_background.hide()
    def toggleTheme(self):
        """
        切换应用的主题模式。
        """
        self.isDarkMode = not self.isDarkMode
        self.applyTheme()

    def viewCurrentNames(self):
        # 检查是否有数据
        if not self.names:
            QMessageBox.warning(self, '警告', '没有数据怎么看名单')
        else:
            # 对名单数据进行排序
            sorted_names = sorted(self.names)
            # 将排序后的名单数据转换为字符串，每行一个名字
            names_str = "\n".join(sorted_names)
            # 创建 QMessageBox 显示名单 但是不要显示Icon pyqt5 版本不同 传参方式不一
            msg_name_list = QMessageBox(self)
            msg_name_list.setWindowTitle('当前名单')
            msg_name_list.setText(names_str)
            # 设置为不显示图标
            msg_name_list.setIcon(QMessageBox.NoIcon)
            # 显示对话框并获取用户响应
            msg_name_list.exec_()
    def showVersionInfo(self):
        # 新增的显示版本信息的函数
        version_info = f"版本：{self.version}\n 当前版本信息：\n 这是第二次更新优化"
        QMessageBox.about(self, '版本信息', version_info)

    def showAboutAuthor(self):
        author_info = """
        作者：Made By @佛系小吴
        简介：PyQt随机点名，欢迎提建议！
        开源地址：\n https://gitee.com/ucanner/py_one_is_all
        """
        QMessageBox.about(self, '关于作者', author_info)

    def updateTime(self):
        current_time = QTime.currentTime()  # 获取当前时间
        time_str = current_time.toString('hh:mm:ss')  # 格式化时间字符串
        self.label_time.setText(time_str)  # 更新时间标签的文本

    # 加载数据
    def loadClassNames(self, index):
        # 根据选中的班级index构建文件名，假设文件名格式为"班级1.txt"
        class_name = self.class_combo.itemText(index)
        filename = f'res/names/{class_name}.txt'
        # 获取程序目录
        directory = os.path.dirname(os.path.realpath(__file__))
        # 构建完整的文件路径
        filepath = os.path.join(directory, filename)
        # 检查文件是否存在
        if os.path.exists(filepath):
            with open(filepath, 'r', encoding='utf-8') as file:
                self.names = [line.strip() for line in file.readlines()]
                self.label_name.setText(f'[{class_name}]被导入')
        else:
            self.label_name.setText('检查文件是否存在')

    def setupVoice(self):
        self.engine = pyttsx3.init()
        self.is_voice_enabled = False

    def applyTheme(self):
        """
        应用指定的主题到界面元素上。
        :param theme: 'dark' 或 'light'，分别代表深色和亮色主题。
        """
        styleSheetBase = """
            QWidget {{
                font-family: {}; /* 设置字体 */
                background-color: {}; /* 主背景颜色 */
                color: {}; /* 文字颜色 */
            }}
            QLabel#label_time {{
                background-color: {}; /* 时间标签背景颜色 */
            }}
            QPushButton {{
                min-width: 75px; /* 设置按钮的最小宽度为100像素 */
                border: 1px solid {}; /* 按钮边框颜色 */
                border-radius: 10px;
                font-size: 12px;
                padding: 5px;
                margin: 2px;
            }}
            QPushButton:hover {{
                border-color: {}; /* 按钮鼠标悬停边框颜色 */
            }}
            QPushButton:pressed {{
                background-color: {}; /* 按钮按下时背景颜色 */
            }}
        """
        if self.isDarkMode:
            # 主背景颜色   文字颜色 时间标签背景颜色  按钮边框颜色 按钮鼠标悬停边框颜色 按钮按下时背景颜色
            styleSheet = styleSheetBase.format(self.DEFAULT_APP_FONT_NAME, self.DARK_APP_BG_COLOR, '#FFFFFF', '#424242', '#4CAF50', '#E41188', '#2E7D32')
        else:  # 默认为亮色主题
            styleSheet = styleSheetBase.format(self.DEFAULT_APP_FONT_NAME, self.LIGHT_APP_BG_COLOR, '#000000', '#F0FFF0', '#AAAAAA', '#4CAF50', '#E41188')
        self.setStyleSheet(styleSheet)

    def startPicking(self):
        if not self.names:  # 如果名单为空
            QMessageBox.warning(self, '警告', '没数据怎么开始')
        else:
            self.is_picking = True
            self.startButton.setEnabled(False)
            self.stopButton.setEnabled(True)  # 启用停止按钮
            self.timer.timeout.connect(self.displayRandomName)
            # 如果随机图片功能被启用，也连接更换背景图片的槽函数
            if self.is_random_picture_enabled:
                # 初始化定时器
                self.picture_timer.timeout.connect(self.changeBackgroundPicture)  # 连接定时器信号和槽函数
                self.picture_timer.start(self.RANDOM_PICTURE_TIME)  # 每2秒更换一次图片，根据需要调整时间间隔
            self.timer.start(60)  # 设置定时器时间间隔

    # 显示姓名
    def displayRandomName(self):
        if self.is_picking:
            self.current_name = random.choice(self.names)  # 选中新的姓名
            self.label_name.setText(self.current_name)
        else:
            self.timer.stop()

    # 改变背景图片
    def changeBackgroundPicture(self):
        # 随机选择一张图片并设置为label_background的背景
        if self.is_random_picture_enabled:
            picture = random.choice(self.pictures_list)
            pixmap = QPixmap(self.get_resource_path(picture))
            self.label_background.setPixmap(pixmap.scaled(self.label_background.size(), Qt.IgnoreAspectRatio))

    #暂停选择姓名
    def stopPicking(self):
        # 检查名单是否为空
        if not self.names:
            QMessageBox.warning(self, '警告', '没名单怎么暂停')
        else:
            if self.is_picking:
                self.is_picking = False
                self.startButton.setEnabled(True)
                self.stopButton.setEnabled(False)
                self.timer.stop()  # 停止定时器
                self.label_name.setText(self.current_name)  # 展示当前被选择的姓名
                if self.is_voice_enabled and self.engine:
                    self.speak(self.current_name, self.SPEAK_NAME_TIME)  # 播放语音2次


    def speak(self, name, times):
        for _ in range(times):
            self.engine.say(name)
            self.engine.runAndWait()

    def importNames(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "导入名单@佛系小吴", "",
                                                   "Text Files (*.txt);;All Files (*)")
        if file_path:
            with open(file_path, 'r', encoding='utf-8') as file:
                self.names = [line.strip() for line in file.readlines()]
            self.label_name.setText('名单已导入')

    def toggleVoice(self, state):
        self.is_voice_enabled = state == Qt.Checked


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = RandomPicker()
    sys.exit(app.exec_())